package com.JUC.cha03.sec06;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 没有自定义线程池，会使用默认的线程池ForkJoinPool
 *
 * 如果执行第一个任务的时候传入了一个自定义线程池；
 *  1. 调用thenRun方法执行第二个任务时，则第二个任务和第一个任务公用同一个线程池
 *  2. 调用thenRunAsync方法执行第二个任务时，则第一个任务使用的是自己传入的线程池，第二个任务使用的是ForkJoinPool线程池
 *
 * 有可能处理的太快，系统优化切换原则，直接使用main线程处理
 */
public class CompletableFutureWithThreadPoolDemo {

    public static void main(String[] args) {

        ExecutorService threadPool = Executors.newFixedThreadPool(5);

        CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
            // 暂停几秒钟线程
            try { TimeUnit.MILLISECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
            System.out.println("1号任务" + "\t" + Thread.currentThread().getName());
            return "abcd";
        }, threadPool).thenRunAsync(() -> {
            // 暂停几秒钟线程
            try { TimeUnit.MILLISECONDS.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); }
            System.out.println("2号任务" + "\t" + Thread.currentThread().getName());
        }).thenRun(() -> {
            // 暂停几秒钟线程
            try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }
            System.out.println("3号任务" + "\t" + Thread.currentThread().getName());
        }).thenRun(() -> {
            // 暂停几秒钟线程
            try { TimeUnit.MILLISECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
            System.out.println("4号任务" + "\t" + Thread.currentThread().getName());
        });

        System.out.println(future.join());
        threadPool.shutdown();

    }
}
